package model.utilitarios;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.joda.time.LocalDate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * Crea un archivo xml con el cuadro de marcha
 * @author Lucas
 *
 */
public class XMLParser {

	private static Document doc; 
	
	public static void crearNuevoCuadroDeMarcha() {
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder;
		try {
			docBuilder = docFactory.newDocumentBuilder();
			// root elements
			doc = docBuilder.newDocument();
			Element rootElement = doc.createElement("cuadroMarcha");
			doc.appendChild(rootElement);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Cierra el documento para el cuadro de marcha
	 */
	public static void cerrarCuadroDeMarcha() {
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer;
		try {
			transformer = transformerFactory.newTransformer();
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(new File("CuadroDeMarcha/cuadro.xml"));
			transformer.transform(source, result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Crea el elemento cuota dentro del cuadro de marcha
	 * @param numeroDeCuota
	 * @param vencimiento
	 * @param amortizacion
	 * @param interes
	 * @param saldodeuda
	 * @param seguro
	 * @param gastos
	 * @param valorcuota
	 * @param valortotalcuota
	 * @param fechadepago
	 * @param interesmora
	 */
	public static void crearCuota(int numeroDeCuota, String vencimiento, double amortizacion, Double interes, double saldodeuda, double seguro, double gastos, double valorcuota, double valortotalcuota, LocalDate fechadepago, double interesmora) {
		Element cuota = doc.createElement("cuota");
		Node root = doc.getFirstChild();
		root.appendChild(cuota);
		
		crearElementoDentroDeCuota("numero" , numeroDeCuota, cuota);
		crearElementoDentroDeCuota("vencimiento" , vencimiento, cuota);
		crearElementoDentroDeCuota("amortizacion" , RedondeadorDeDoubles.round(amortizacion), cuota);
		crearElementoDentroDeCuota("interes" , RedondeadorDeDoubles.round(interes), cuota);
		crearElementoDentroDeCuota("saldodeuda" , RedondeadorDeDoubles.round(saldodeuda), cuota);
		crearElementoDentroDeCuota("seguro" , RedondeadorDeDoubles.round(seguro), cuota);
		crearElementoDentroDeCuota("gastos" , RedondeadorDeDoubles.round(gastos), cuota);
		crearElementoDentroDeCuota("valorcuota" , RedondeadorDeDoubles.round(valorcuota), cuota);
		crearElementoDentroDeCuota("valortotalcuota" , RedondeadorDeDoubles.round(valortotalcuota), cuota);
		crearElementoDentroDeCuota("fechadepago" , fechadepago, cuota);
		crearElementoDentroDeCuota("interesmora" , RedondeadorDeDoubles.round(interesmora), cuota);
	}

	/**
	 * Crea un elemento simple en el cuadro de marcha
	 * @param nombreElemento
	 * @param valorElemento
	 * @param cuota
	 */
	private static void crearElementoDentroDeCuota(String nombreElemento , Object valorElemento, Element cuota) {
		Element element = doc.createElement(nombreElemento);
		String valor;
		if(valorElemento == null){
			valor = "---";
		}
		else{
			valor = valorElemento.toString();
		}
		element.appendChild(doc.createTextNode(valor));
		cuota.appendChild(element);
	}
}
